package OOM;

import java.nio.ByteBuffer;
import java.util.ArrayList;
import java.util.List;

/**
 * 直接内存溢出，除了使用堆内存外，还可能用直接内存，即堆外内存。NIO为了提高性能，避免在Java Heap和native Heap中切换，
 * 所以使用直接内存，默认情况下，直接内存的大小和对内存大小一致。堆外内存不受JVM的限制，但是受制于机器整体内存的大小限制。
 * 如下代码设置堆最大内存为128m，直接内存为100m，然后我们每次分配1M放到list里边。
 * <p>
 * -Xmx128m -XX:MaxDirectMemorySize=100M
 * 作者：风平浪静如码
 * 链接：https://www.jianshu.com/p/0e5ab3ba1e8a
 * 来源：简书
 * 著作权归作者所有。商业转载请联系作者获得授权，非商业转载请注明出处。
 *
 * @author caihe
 * @date 2021/11/1 15:25
 */
public class DirectBufferOOM {

    public static void main(String[] args) {
        final int _1M = 1024 * 1024;
        List<ByteBuffer> buffers = new ArrayList<>();
        int count = 0;

        while (true) {
            try {
                ByteBuffer buffer = ByteBuffer.allocateDirect(_1M);
                buffers.add(buffer);
                count++;
            } catch (Throwable e) {
                System.out.println(count);
                e.printStackTrace();
                return;
            }
        }
//        System.out.println("maxDirectMemory is:"+sun.misc.VM.maxDirectMemory() / 1024 / 1024 + "MB");
//
//        ByteBuffer buffer = ByteBuffer.allocateDirect(7*1024*1024); 

    }
}
